保持SYCL、DPC++和ISO C++之间的紧密一致有两个优点。首先，使SYCL和DPC++能够利用标准C++的最新和最伟大的特性来提高开发人员的生产力。其次，增加了SYCL或DPC++中引入的异构编程特性，以及影响标准C++未来发展方向(例如，executor)的机会。\par

SYCL 1.2.1是基于C++11的，而对SYCL 2020和DPC++接口的许多最大的改进都是在C++14(例如，通用Lambda)和C++17(例如，类模板参数演绎-CTAD)中引入的语言特性中才可能实现的。\par

C++20规范是在2020年发布的(当时我们正在写这本书!)它包括一些已经被DPC++和SYCL预先采用的特性(例如，std::atomic\_ref, std::bit\_cast)，随着我们走向SYCL的下一个官方版本(2020之后的临时版本)和DPC++的下一个版本，我们期望与C++20更紧密地结合。例如，C++20以std::latch和std::barrier的形式引入了一些额外的线程同步例程；我们已经在第19章探讨了如何使用类似的接口来定义设备范围的栅栏，并且在C++20的新语法中重新检查子工作组和工作组的栅栏也是有意义的\par

C++23的工作已经开始了，因为规范还没有最终定稿，所以在SYCL或DPC++规范中采用任何这些特性都将是一个错误——这些特性可能会在进入C++23之前发生重大变化，导致难以修复的不兼容性。然而，有许多正在讨论的特性可能会改变未来SYCL和DPC++程序的形式和行为。最令人兴奋的提议特性之一是mdspan，这是一个非拥有的数据内存，它为指针提供多维数组语法，并提供一个AccessorPolicy作为控制对底层数据访问的扩展点。这些语义与SYCL访问器的语义非常相似，mdspan将使访问器类语法能够用于缓冲区和USM分配，如图EP-1所示。\par

\hspace*{\fill} \par %插入空行
图EP-1 使用mdspan将类似访问器的索引附加到USM指针
\begin{lstlisting}[caption={}]
queue Q;
constexpr int N = 4;
constexpr int M = 2;
int* data = malloc_shared<int>(N * M, Q);
stdex::mdspan<int, N, M> view{data};
Q.parallel_for(range<2>{N, M}, [=](id<2> idx) {
	int i = idx[0];
	int j = idx[1];
	view(i, j) = i * M + j;
}).wait();
\end{lstlisting}

希望mdspan成为标准C++只是时间问题。同时，我们建议感兴趣的读者尝试参考Kokkos项目的开源产品质量参考实现。\par

另一个令人兴奋的特性是std::simd类模板它试图为C++中的显式向量并行提供可移植的接口。采用这个接口将在第11章中描述的两种不同的向量类型使用之间提供明确的区别:使用向量类型来方便程序员，使用向量类型来进行底层性能调优。同一种语言中同时支持SPMD和SIMD编程风格也提出了一些有趣的问题:应该如何声明内核使用哪种风格，是否能够在同一个内核中混合和匹配样式?希望未来的供应商扩展能够探索这些问题，因为在标准化之前，供应商会在这个领域进行试验。\par


















